La sélection de fontes et de couleurs se fait à peu près comme la sélection de fichiers. Il y a trois manières de les implémenter, en tant que widget, en tant que dialogue ou en tant que boutons. Les valeurs sélectionnées par l'utilisateur sont récupérées par le biais d'attributs ou de fonctions appropriées. Nous allons d'abord aborder la sélection de fontes, on utilise:
fontSelectionNew :: IO FontSelection
fontSelectionDialogNew :: String -> IO FontSelectionDialog
fontButtonNew :: IO FontButton
Le paramètre String est le titre de la fenêtre de dialogue. Il y a une série d'attributs et des fonctions pour gérer l'affichage de ces widgets. Toutes assez simples. Avec un dialogue, vous pouvez utiliser les types ResponseId; et avec vous utiliserez:
onFontSet:: FontButtonClass self => self -> IO () -> IO (ConnectId self)
Vous utiliserez alors la fonction suivante pour obtenir le nom de la fonte sélectionnée:
fontButtonGetFontName :: FontButtonClass self => self -> IO String
Le nom de la fonte sera quelque chose comme "Courier Italic 10" ou "URW Gothic L Semi-Bold Oblique 16", tout ce qui est disponible sur votre système. Comme vous pouvez le voir sur l'image suivante, l'utilisateur peut sélectionner une famille, un style, une taille.
Chercher et obtenir des informations sur les fontes est documenté dans Graphics.UI.Gtk.Pango.Font. Beaucoup de fonctionnalités avancées sont supportées, mais l'utilisateur de base aura seulement besoin de savoir comment obtenir une description (FontDescription) à partir du nom d'une fonte.
fontDescriptionFromString :: String -> IO FontDescription
Une fois que l'on a la description (FontDescription) on peut utiliser:
widgetModifyFont:: WidgetClass self => self -> Maybe FontDescription -> IO ()
La sélection d'une couleur est analogue à la sélection d'une fonte. Vous avez trois possibilités:
colorSelectionNew :: IO Color Selection
colorSelectionDialogNew: :: String -> IO ColorSelectionDialog
colorButtonNew :: IO Color Button
Avec un bouton ColorButton, utilisez
onColorSet :: ColorButtonClass self => self -> IO () -> IO (ConnectId self)
puis:
colorButtonGetColor :: ColorButtonClass self => self -> IO Color
Il y a aussi une fonction (et un attribut) pour obtenir la valeur Alpha (l'opacité) si cette fonctionnalité a été activée.
La fenêtre par défaut de sélection de couleur, ressemble à cela:
Une couleur est un type de données composées de trois entiers Int, pouvant aller de 0 à 65535, qui spécifient respectivement les composantes Rouge, Vert et Bleu. Il y a des fonctions pour définir les couleurs d'avant-plan, d'arrière-plan, les textes et les couleurs d'un widget et ces fonctions prennent un paramètre StateType Il y a: StateNormal, StateActive, StatePreLight, StateSelected et StateInsensitive et varient suivant que le widget est actif, le pointeur de la souris est sur le widget, si le widget est sélectionné, …. L'affichage des widgets a plusieurs fonctionnalités, mais pour changer la couleur d'une étiquette, vous pouvez simplement utiliser StateNormal et la couleur Color que l'utilisateur a choisi:
widgetModifyFg :: WidgetClass self => self -> StateType -> Color -> IO ()
Si on ne connaît pas l'état StateType du widget, on peut utiliser cette fonction:
widgetGetState :: WidgetClass w => w -> IO StateType
Voici un exemple de sélection de fonte et de couleur.
La fenêtre se redimensionne automatiquement pour s'adapter à la fonte la plus large.
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "Font and Color Selection",
containerBorderWidth := 10 ]
vb <- vBoxNew False 0
containerAdd window vb
qtlab <- labelNew (Just "How poor are they that have not
patience!\nWhat wound did ever heal but by degrees?\nThou know'st
we work by wit, and not by witchcraft;\nAnd wit depends on dilatory
time.")
boxPackStart vb qtlab PackGrow 0
srclab <- labelNew (Just "From Othello (II, iii, 376-379)")
srcfont <- fontDescriptionFromString "Courier Italic 10"
widgetModifyFont srclab (Just srcfont)
miscSetAlignment srclab 1.0 0.5
boxPackStart vb srclab PackNatural 10
sep <- hSeparatorNew
boxPackStart vb sep PackGrow 10
fntb <- fontButtonNew
boxPackStart vb fntb PackGrow 0
colb <- colorButtonNew
boxPackStart vb colb PackGrow 0
onFontSet fntb $ do name <- fontButtonGetFontName fntb
fdesc <- fontDescriptionFromString name
widgetModifyFont qtlab (Just fdesc)
putStrLn name
onColorSet colb $ do colour <- colorButtonGetColor colb
widgetModifyFg qtlab StateNormal colour
putStrLn (show colour)
widgetShowAll window
onDestroy window mainQuit
mainGUI
instance Show Color where
show (Color r g b) = "Red: " ++ (show r) ++
" Green: " ++ (show g) ++
" Blue: " ++ (show b)